/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package servlets;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;

import dbUtil.*;
import iteradores.*;
import beans.*;
import utils.MD5;

/**
 *
 * @author Administrador
 */
public class ManejadorSolicitudRegistro extends HttpServlet {

    private String nombreModulo = "solicitudregistro";
    private IteradorUsuario usuarioActual;

    /** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html");
        response.setCharacterEncoding("windows-1252");
        PrintWriter out = response.getWriter();
        String url = "";

        try {
            Connection con = null;
            //Obtiene la operación a realizar 
            String str_op = request.getParameter("op");

            //Datos del solicitudregistro actual de la sesion, si esto es nulo significa
            //que aun no hizo login
            usuarioActual = (IteradorUsuario) request.getSession().getAttribute("usuarioActual");

            if (usuarioActual == null) {
                if (str_op == null || str_op.equals("REGISTRAR")) {
                    //Trae los tipos de documentos
                    con = BD.getCon(getDataBaseConfig());

                    con.setAutoCommit(false);

                    TipoDocumento tipodocumento = new TipoDocumento();
                    tipodocumento.setCon(con);
                    tipodocumento.getTiposDocumentos();

                    IteradorTipoDocumento it = (IteradorTipoDocumento) tipodocumento.getIteratorAll();
                    request.setAttribute("TiposDocumento", it);

                    request.setAttribute("beanTipoDocumento", tipodocumento);

                    request.getSession().setAttribute("lastBeanTipoDocumento", tipodocumento);

                    //Aún no es Solicitante, está en proceso de registrarse
                    url = "solicitudregistro.jsp?modo=REGISTRO";

                } else if (str_op.equals("INSERT")) {
                    con = BD.getCon(getDataBaseConfig());

                    url = this.insert_data(con, request, response);
                }
            } else {
                // Obtiene la conexión a la base de datos de la sesión
                con = (Connection) request.getSession().getAttribute("ConexionBd");
                //Objeto que averigua si el solicitudregistro tiene permiso para acceder al servlet.
                PgAbm testPermiso = new PgAbm();
                testPermiso.setCon(con);

                usuarioActual.getReset();
                usuarioActual.getNext();

                if (testPermiso.tienePermiso(nombreModulo,
                        usuarioActual.getNombreusuario(),
                        str_op.substring(0, 6))) {

                    String action = request.getParameter("action");

                    action = action == null ? "" : action;

                    url = "admin.jsp";

                    if (str_op.equals("SELECT")) {
                        url = this.select_data(con, request, response, str_op);
                    } else if (str_op.equals("APROBR") && action.equals("do")) {
                        url = this.update_data(con, request, response, str_op);
                    } else if (str_op.equals("ANULAR") && action.equals("do")) {
                        url = this.update_data(con, request, response, str_op);
                    }
                } else {
                    url = "sinpermiso.jsp";
                }
            }

            mostrar_pagina(url, request, response);
        } catch (Exception e) {
            e.printStackTrace(out);
        }

    }

    public void mostrar_pagina(String url, HttpServletRequest req, HttpServletResponse resp)
            throws Exception {
        RequestDispatcher disp = req.getRequestDispatcher(url);
        resp.setHeader("Cache-Control", "no-cache");
        resp.setCharacterEncoding("windows-1252");
        resp.setHeader("Pragma", "no-cache");
        resp.setIntHeader("Expires", 0);
        disp.forward(req, resp);
    }

    public DBConfig getDataBaseConfig() {
        ServletContext scon = getServletContext();
        DBConfig dc = new DBConfig();
        dc.setDbname(scon.getInitParameter("dbname"));
        dc.setServer(scon.getInitParameter("dbserver"));
        dc.setUser(scon.getInitParameter("dbuser"));
        dc.setPass(scon.getInitParameter("dbpass"));
        return dc;
    }
//<editor-fold defaultstate="collapsed" desc="Métodos ABM (SELECT, INSERT, UPDATE y DELETE).">
    public String select_data(
            Connection con, HttpServletRequest request, HttpServletResponse response, String operacion) throws Exception {
        String url = "solicitudregistro.jsp?modo=SELECT";
        String action = request.getParameter("action");

        if ((action != null) && (action.equalsIgnoreCase("do") || action.equalsIgnoreCase("slc"))) {
            con.setAutoCommit(false);

            SolicitudRegistro solicitudregistro = new SolicitudRegistro();

            solicitudregistro.setAllParams(request);

            String smode = request.getParameter("searchmode");
            if ((smode != null) && smode.equalsIgnoreCase("exact")) {
                solicitudregistro.setSearchMode(PgAbm.SEARCH_EXACT);
            } else {
                solicitudregistro.setSearchMode(PgAbm.SEARCH_APROX);
            }

            String sscope = request.getParameter("searchscope");
            if ((sscope != null) && sscope.equalsIgnoreCase("all")) {
                solicitudregistro.setSearchScope(PgAbm.SEARCH_ALL);
            } else {
                solicitudregistro.setSearchScope(PgAbm.SEARCH_SOME);
            }

            solicitudregistro.setCon(con);
            solicitudregistro.setEstado("P");
            solicitudregistro.load_data();
            IteradorSolicitudRegistro it = (IteradorSolicitudRegistro) solicitudregistro.getIterator();
            request.setAttribute("SolicitudesRegistro", it);

            TipoDocumento nc = (TipoDocumento) request.getSession().getAttribute("lastBeanTipoDocumento");
            if (nc == null) {
                nc = new TipoDocumento();
            }

            //Trae todos los tipos de módulos y lo coloca en una tabla.
            nc.setCon(con);
            nc.getTiposDocumentos();
            IteradorTipoDocumento it2 = (IteradorTipoDocumento) nc.getIteratorAll();
            request.setAttribute("TiposDocumento", it2);

            request.setAttribute("beanTipoDocumento", nc);
            //Seteamos en la sesión para conservar los filtros set*
            request.getSession().setAttribute("lastBeanSolicitudRegistro", solicitudregistro);

            url += "&msg=SHOW";
        } else {
            con.setAutoCommit(false);

            TipoDocumento tipodocumento = new TipoDocumento();
            tipodocumento.setCon(con);
            tipodocumento.getTiposDocumentos();

            IteradorTipoDocumento it = (IteradorTipoDocumento) tipodocumento.getIteratorAll();
            request.setAttribute("TiposDocumento", it);

            request.setAttribute("beanTipoDocumento", tipodocumento);

            request.getSession().setAttribute("lastBeanTipoDocumento", tipodocumento);
        }
        return url;
    }

    public String insert_data(
            Connection con, HttpServletRequest request, HttpServletResponse response) throws Exception {
        String url = "solicitudregistro.jsp?modo=REGISTRO";
        String action = request.getParameter("action");

        if ((action != null) && action.equalsIgnoreCase("do")) {
            con.setAutoCommit(false);

            ResultSet rs_datos = null;

            try {
                String pass = "";

                pass = request.getParameter("contrasenha");
                MD5 crypt = new MD5(pass);

                CallableStatement proc = con.prepareCall("{? = call ins_solicitud_registro ( " +
                        "?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) }",
                        ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);

                proc.registerOutParameter(1, Types.OTHER);
                proc.setString(2, request.getParameter("nombreusuario").equals("") ? null : request.getParameter("nombreusuario"));
                proc.setString(3, crypt.getMD5().trim());
                proc.setString(4, request.getParameter("nombre").equals("") ? null : request.getParameter("nombre"));
                proc.setString(5, request.getParameter("apellido").equals("") ? null : request.getParameter("apellido"));
                proc.setString(6, request.getParameter("direccion").equals("") ? null : request.getParameter("direccion"));
                proc.setString(7, request.getParameter("telefono").equals("") ? null : request.getParameter("telefono"));
                proc.setString(8, request.getParameter("telefonomovil").equals("") ? null : request.getParameter("telefonomovil"));
                proc.setString(9, request.getParameter("email").equals("") ? null : request.getParameter("email"));
                proc.setInt(10, Integer.parseInt(request.getParameter("idtipodocumento")));
                proc.setString(11, request.getParameter("nrodocumento"));
                proc.setString(12, request.getParameter("nombreoperativo"));
                proc.setString(13, request.getParameter("observacion").equals("") ? null : request.getParameter("observacion"));

                proc.execute();

                rs_datos =
                        (ResultSet) proc.getObject(1);

                int cant_filas = 0;
                if (rs_datos.last()) {
                    cant_filas = rs_datos.getRow();
                    rs_datos.beforeFirst();
                }

                System.out.println("Filas ingresadas: " + cant_filas);

                IteradorSolicitudRegistro it = new IteradorSolicitudRegistro(rs_datos);
                request.setAttribute("SolicitudesRegistro", it);

                TipoDocumento nc2 = (TipoDocumento) request.getSession().getAttribute("lastBeanTipoDocumento");
                if (nc2 == null) {
                    nc2 = new TipoDocumento();
                }

                nc2.setCon(con);
                nc2.getTiposDocumentos();
                IteradorTipoDocumento it2 = (IteradorTipoDocumento) nc2.getIteratorAll();
                request.setAttribute("TiposDocumento", it2);
                request.setAttribute("beanTipoDocumento", nc2);

                con.commit();

                url = "solicitudregistro.jsp?modo=REGISTRO&msg=DONE";
            } catch (SQLException ex) {
                request.setAttribute("error", ex.getMessage());
                System.out.println(ex.getMessage());
                url = "solicitudregistro.jsp?modo=REGISTRO&msg=ERROR";

                TipoDocumento nc2 = (TipoDocumento) request.getSession().getAttribute("lastBeanTipoDocumento");
                if (nc2 == null) {
                    nc2 = new TipoDocumento();
                }

                con.rollback();
                con.setAutoCommit(false);

                nc2.setCon(con);
                nc2.getTiposDocumentos();
                IteradorTipoDocumento it2 = (IteradorTipoDocumento) nc2.getIteratorAll();
                request.setAttribute("TiposDocumento", it2);
                request.setAttribute("beanTipoDocumento", nc2);
            }

        } else {
            con.setAutoCommit(false);

            TipoDocumento tipodocumento = new TipoDocumento();
            tipodocumento.setCon(con);
            tipodocumento.getTiposDocumentos();
            IteradorTipoDocumento it = (IteradorTipoDocumento) tipodocumento.getIteratorAll();
            request.setAttribute("TiposDocumento", it);

            request.setAttribute("beanTipoDocumento", tipodocumento);
            request.getSession().setAttribute("lastBeanTipoDocumento", tipodocumento);
        }

        return url;
    }

    public String update_data(
            Connection con, HttpServletRequest request, HttpServletResponse response, String operacion) throws Exception {
        String url = "solicitudregistro.jsp?modo=SELECT";

        String action = request.getParameter("action");
        String estado = operacion.equals("APROBR") ? "A" : "N";

        if ((action != null) && action.equalsIgnoreCase("do")) {
            String str_idSolicituRegistro = request.getParameter("idsolicitudregistro");

            if ((str_idSolicituRegistro != null) && (str_idSolicituRegistro.length() > 0)) {
                int idSolicitudRegistro = 0;
                idSolicitudRegistro = Integer.parseInt(str_idSolicituRegistro);
            } else {
                throw new Exception("El id del solicitudregistro que desea modificar no es válido.");
            }

            try {
                con.setAutoCommit(false);

                SolicitudRegistro solicitudregistro = new SolicitudRegistro();
                solicitudregistro.setCon(con);
                solicitudregistro.setEstado(estado);
                solicitudregistro.setOperador(usuarioActual.getNombreusuario());
                solicitudregistro.setAllParams(request);
                solicitudregistro.update_data();

                /* 
                 * Aplicamos nuevamente los filtros anteriores para refrescar los
                 * datos en pantalla.
                 */
                SolicitudRegistro nc = (SolicitudRegistro) request.getSession().getAttribute("lastBeanSolicitudRegistro");
                if (nc == null) {
                    nc = new SolicitudRegistro();
                }

                nc.setCon(con);
                solicitudregistro.setEstado("P");
                nc.load_data();
                IteradorSolicitudRegistro it = (IteradorSolicitudRegistro) nc.getIterator();
                request.setAttribute("SolicitudesRegistro", it);

                TipoDocumento nc2 = (TipoDocumento) request.getSession().getAttribute("lastBeanTipoDocumento");
                if (nc2 == null) {
                    nc2 = new TipoDocumento();
                }

                nc2.setCon(con);
                nc2.getTiposDocumentos();
                IteradorTipoDocumento it2 = (IteradorTipoDocumento) nc2.getIteratorAll();
                request.setAttribute("TiposDocumento", it2);
                request.setAttribute("beanTipoDocumento", nc2);

                request.getSession().setAttribute("lastBeanTipoDocumento", nc2);

                con.commit();
                url += "&msg=" + estado + "DONE";
            } catch (SQLException ex) {
                request.setAttribute("error", ex.getMessage());
                System.out.println(ex.getMessage());
                url += "&msg=ERROR";
                con.rollback();
            }
        }
        return url;
    }
//</editor-fold>
    
// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
    }

    @Override
    public void destroy() {
    }

    /** Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     */
    @Override
    public String getServletInfo() {
        return "Este servlet maneja las peticiones sobre la tabla SolicitudRegistro";
    }
// </editor-fold>
}
